for

您所在的位置:网站首页 python循环中的for range for

for

2023-10-30 17:01| 来源: 网络整理| 查看: 265

 

for _ in list中的下划线_只是一个临时的循环变量, 因为_是合法的变量名

for _ in [1, 2, 3]: print(_) li = [[0, 1] for _ in range(3)] tu1 = ([0, 1] for _ in range(3)) # ()返回生成器, 而不是列表 tu2 = list([0, 1] for _ in range(3)) print(li) print(tu1) print(tu2) ''' 输出结果: [[0, 1], [0, 1], [0, 1]] [[0, 1], [0, 1], [0, 1]] '''

 

下面将详细的讨论以下Python中下划线_的使用

 

 

一、 单个下划线直接做变量名(_)

  主要有三种情况:

1. 解释器中

  _符号是指交互解释器中最后一次执行语句的返回结果。这种用法最初出现在CPython解释器中,其他解释器后来也都跟进了。

 

 

 

2. 作为名称使用

  这个跟上面有点类似。_用作被丢弃的名称。按照惯例,这样做可以让阅读你代码的人知道,这是个不会被使用的特定名称。举个例子,你可能无所谓一个循环计数的值:

n = 42 for _ in range(n): do_something()

 

 

3.国际化

  _还可以被用作函数名。这种情况,单下划线经常被用作国际化和本地化字符串翻译查询的函数名。这种惯例好像起源于C语言。举个例子,在 Django documentation for translation 中你可能会看到:

from django.utils.translation import ugettext as _ from django.http import HttpResponse def my_view(request): output = _("Welcome to my site.") return HttpResponse(output)

 

第二种和第三种用法会引起冲突,所以在任意代码块中,如果使用了_作国际化翻译查询函数,就应该避免再用作被丢弃的变量名。

 

二、 单下划线前缀的名称(例如_shahriar)

  以单下划线做前缀的名称指定了这个名称是“私有的”。在有些导入import * 的场景中,下一个使用你代码的人(或者你本人)会明白这个名称仅内部使用。Python documentation里面写道:

 

  a name prefixed with an underscore (e.g. _spam) should be treated as a non-public part of the API (whether it is a function, a method or a data member). It should be considered an implementation detail and subject to change without notice.

 

  之所以说在在 有些 import * 的场景,是因为导入时解释器确实对单下划线开头的名称做了处理。如果你这么写from import *,任何以单下划线开头的名称都不会被导入,除非模块/包的__all__列表明确包含了这些名称。更多相关信息见““Importing * in Python”。

 

 

三、双下划线前缀的名称(例如__shahriar)

  以双下划线做前缀的名称(特别是方法名)并不是一种惯例;它对解释器有特定含义。Python会改写这些名称,以免与子类中定义的名称产生冲突。Python documentation中提到,任何__spam这种形式(至少以两个下划线做开头,绝大部分都还有一个下划线做结尾)的标识符,都会文本上被替换为_classname__spam,其中classname是当前类名,并带上一个下划线做前缀。

class A(object): def _internal_use(self):  # 单下划线 pass def __method_name(self):  # 双下划线 pass print(dir(A)) ''' 输出结果: ['_A__method_name', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_internal_use'] '''

 

 

  正如所料,_internal_use没有变化,但__method_name被改写成了_ClassName__method_name。现在创建一个A的子类B(这可不是个好名字),就不会轻易的覆盖掉A中的__method_name了:

class A(object): def _internal_use(self): pass def __method_name(self): pass class B(A): def __method_name(self):pass print(dir(B)) ''' 输出结果: ['_A__method_name', '_B__method_name', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_internal_use'] '''

 

 

 

四、名称前后的双下划线(如:__init__)

  这种用法表示Python中特殊的方法名。其实,这只是一种惯例,对Python系统来说,这将确保不会与用户自定义的名称冲突。通常,你将会覆写这些方法,并在里面实现你所需要的功能,以便Python调用它们。例如,当定义一个类时,你经常会覆写“__init__”方法。虽然也可以编写自己的特殊方法名,但不要这样做。

class C: def __init__(self,name): self.name = name def __showname(self): pass print(dir(C)) ''' ['_C__showname', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__'] '''


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3